package AOP;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Calc1ImplDynamicProxy {
    private Object target;

    public Calc1ImplDynamicProxy(Object target) {
        this.target = target;
    }
    public Object getProxy(){
        //定义代理对象
        Object proxyObj = null;
        //获取代理对象
        //1. 目标对象类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2. 目标对象实现接口(代理类实现接口集合)
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //3. InvocationHandler:动态执行目标对象相应方法
        proxyObj = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            /**
             * @Author: zhangchunsheng
             * @Date: 2024/8/16 10:29
             * Student{ 学生属性:静态特征,属性方法:动态特征}
             * Cat{ 猫属性,猫方法}
             * 将class共同特征,提取Class
             *  Method:方法
             *  Filed:字段
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //获取目标对象方法名称
                String methodName = method.getName();
                //日志(方法前):
                MyLogging.methodBefore(methodName,args);
                //动态执行目标对象方法
                Object rs = method.invoke(target, args);
                //日志(方法后):
                MyLogging.methodAfter(methodName,rs);
                return rs;
            }
        });

        return proxyObj;
    }

}
